package com.atgg.config;

import com.atgg.beans.Car;
import com.atgg.beans.Cat;
import com.atgg.beans.Dog;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

import javax.annotation.PostConstruct;

/**
 * bean的生命周期
 *  bean的创建--->初始化---->销毁过程
 *
 *  容器管理bean的生命周期
 *
 *  可以自定义初始化和销毁方法，容器在bean进行到当前生命周期的时候来调用我们的方法
 *             (1) 构造 （对象创建）相当于定义init-method和 destroy-method标签的内容
 *                      单实例：在容器启动时创建对象
 *                      多实例：在每次获取时，创建对象
 *             （2）初始化 对象创建完成，并赋值好，调用初始化方法.....
 *   ·         （3）销毁
 *                  单实例：容器关闭的时候调用destroy方法
 *                  多实例：容器不会管理这个bean,容器不会调用销毁方法
 *
 *
 * (1)指定初始化和销毁方法
 *      通过@Bean指定init-method和 destroy-method方法
 * (2)实现 InitializingBean接口 （定义初始化方法）和DisposableBean接口（定义销毁方法）
 *
 * (3)使用JSR250
 *      @PostConstruct: 在bean创建完成，并且属性赋值完成，来初始化方法
 *      @PreDestroy: 在容销毁bean之前，进行清理工作
 *
 *  (4)BeanPostProcessor:bean的后置处理器
 *          postProcessBeforeInitialization：初始化之前
 *          postProcessAfterInitialization：初始化之后
 *
 *
 */


@ComponentScan(value = "com.atgg.beans")
@Configuration
public class ConfigOfBeanLifeCycle {
    @Scope("prototype")
    @Bean(initMethod = "init",destroyMethod = "destroy")
//    @Bean
    public Car car(){
        return new Car();

    }
    @Scope("prototype")//多例的在获取时，才创建bean
    @Bean(value = "cat")
    public Cat cat(){
        return new Cat();
    }

    @Bean(value = "dog")
    public Dog dog(){
        return new Dog();
    }
}
